原先的 browser 實作就已經包含了無痕模式的細部功能,像是禁止使用 Cookie,和不記錄瀏覽歷史;但是卻沒有一個快速開關能夠進到一般瀏覽器支援的無痕模式。
所以,今天我來講講怎麼實作一鍵進入無痕模式。
首先,將進入點實作在長按分頁鍵。這是個蠻合理的位置。並在ConfigManager
中加入一個關於無痕模式的狀態。
binding.omniboxTabcount.setOnLongClickListener {
config.isIncognitoMode = !config.isIncognitoMode
true
}
當 ConfigManager
的狀態被改變時,BrowserActivity
會將這個狀態傳入當前的 WebView
分頁中,然後 updateWebViewCountUI()
將分頁預覽按鈕的圖案改成是虛線的。
private val preferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
key.equals(ConfigManager.K_IS_INCOGNITO_MODE) -> {
ninjaWebView.incognito = config.isIncognitoMode
updateWebViewCountUI()
NinjaToast.showShort(
this,
"Incognito mode is " + if (config.isIncognitoMode) "enabled." else "disabled."
)
}
...
}
再來看看 NinjaWebView
中的修改。首先也是增加 incognito 的狀態。當它被賦值時,會同時去呼叫 toggleCookieSupport()
,藉此開關 Cookie 的支援。
var incognito: Boolean = false
set(value) {
field = value
toggleCookieSupport(!incognito)
}
除了 Cookie 開關外,在 NinjaWebViewClient
中的 onPageFinished()
原先有在記錄瀏覽歷轉的地方,也要多加上 incognito 的判斷才行:
override fun onPageFinished(view: WebView, url: String) {
// skip translation pages
if (config.saveHistory && !ninjaWebView.incognito && !isTranslationDomain(url)) {
addHistoryAction(url)
}
...
}
如此一來,就可以在主畫面快速地切換到無痕模式,不用再一樣樣功能去切來切去。使用上方便許多。